// ts中的基本类型

let str: string = "";
let number: number = 1;
let bool: boolean = true;

let numberClass1: Number = 1; //大写字母开头的 说明此类型是一个类-类型
let numberClass2: Number = Number(1); // 被强制转化了
// let numberClass3: number = new Number(1);  // error

// 数组类型  不限制长度和内部存储的数据
let arr: string[] = ["1", "2"]; // 纯string []
let arr1: (string | number)[] = [1, "2"]; // string和number联合类型组成的
let arr2: Array<number | string> = [1, "2"]; // 通过泛型声明数组

// 元组 限制长度和数据顺序
let tuple: [string, number, boolean] = ["1", 1, true];
tuple.push(1); // 可push  不可调用tuple[3] 且只能添加 元组中已存在的类型

// 枚举  普通枚举   常量枚举   异构枚举
enum StATUS1 { // 普通枚举  可反举例（只有数字类型可才可以反举）
  ok = 200,
  NOT_FOUND = 404,
}
const enum StATUS2 { // 常量枚举  不会被编译为对象 直接用过常量替换
  ok = 200,
  NOT_FOUND = 404,
}
enum StATUS3 { // 异构枚举 当存在不为number类型的枚举值
  ok = 200,
  NOT_FOUND = 404,
  a = "b",
}

enum StATUS4 { //（为number时可以自动为值依次递增）
  ok, // 0
  NOT_FOUND, //1
}

enum StATUS5 { //（为number时可以自动为值依次递增）
  ok = 200,
  NOT_FOUND, //201
  MOVE, // 202
}

// null 和undefined  可以为任何类型的子类型
let nu: null = null;
let un: undefined = undefined;

// never  程序正常运行情况下 永远不会执行
function throeError1(): never {
  throw new Error("错误");
}

function throeError2(): never {
  while (true) {}
}

type ICircle = { r: number; kind: "circle" };
type ISquare = { width: number; kind: "square" };

function validate(obj: never) {}
// kind 为ts的可辨类型
function getArea(obj: ICircle | ISquare) {
  if (obj.kind === "circle") {
    return obj.r * obj.r;
  }
  if (obj.kind === "square") {
    return obj.width * obj.width;
  }

  validate(obj); // 上面两个if任何一个没有 都不会执行到这里
}

// void   函数不写返回值默认就是一个void  可兼容undefined

function sum2(): void {}
function sum3(): void {
  return undefined;
}
// function sum1(): void {return 1} // error
// function sum2(): undefined {} // error

// object 除了基本类型都可以用object标识 标识对象与函数

function create(target: object) {
  // target.name // error
  // target[0]   // error
  target;
}

create({});
create([]);
// create('') //error

//  Symbol  bigInt 类型

let s1: Symbol = Symbol();
let s2: Symbol = Symbol();
console.log(s1 === s2); // false
let s3 = Symbol();
let s4 = Symbol();
console.log(s3 === s4); // false

let b1: bigint = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(100);
console.log(b1); // 9007199254741091n

let name = ""; // ts内部默认会生成一个name变量， 通过export将此文件标识需要模块化的文件

export {};
